from CDB import CDB

class MemoryUnit:
    def __init__(self, cdb: CDB):
        self.busy = False  # 标志单元是否忙碌
        self.delay_time = 1  # 需要的周期数（延迟周期）
        self.instruction = None  # 当前执行的指令
        self.current_clock = 0  # 当前的时钟周期
        self.start_clock = 0  # 开始时的时钟周期
        self.cdb = cdb  # 公共数据总线对象

    def issue_instr(self, instruction, current_clock):
        """
        将指令发到内存单元执行。
        :param instruction: 要执行的指令。
        :param current_clock: 当前时钟周期。
        """
        if not self.busy:
            # 如果内存单元不忙碌，则开始执行指令
            self.instruction = instruction
            self.start_clock = current_clock
            self.current_clock = current_clock
            self.busy = True
            print(f"Issued instruction {instruction} at clock cycle {current_clock}")

    def execute(self):
        """
        执行内存访问。
        :return: 如果指令执行完成且总线空闲，返回成功标志（如1）。否则返回None。
        """
        if self.busy:
            self.current_clock += 1
            # 判断内存访问是否完成，并且公共数据总线是否空闲
            if self.current_clock - self.start_clock >= self.delay_time and not self.cdb.busy:
                # 执行完成，广播结果到CDB
                self.busy = False
                self.cdb.broadcast(self.instruction["Entry"], 1)  # 假设1为广播成功的标志
                print(f"Instruction {self.instruction} completed at clock cycle {self.current_clock}")
                return 1  # 表示成功
        return None
